package com.smart.community.region.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.region.entity.ShopFeeStandard;
import com.smart.community.region.vo.ShopFeeStandardVO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * 店铺费用标准Mapper接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-09-30
 */
public interface ShopFeeStandardMapper extends BaseMapper<ShopFeeStandard> {
    
    /**
     * 分页查询费用标准
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @return 分页结果
     */
    IPage<ShopFeeStandard> selectFeeStandardPage(Page<ShopFeeStandard> page,
                                                   @Param("shopId") Long shopId,
                                                   @Param("feeType") String feeType);
    
    /**
     * 分页查询费用标准VO（包含店铺名称）
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param status 状态
     * @return 分页结果
     */
    IPage<ShopFeeStandardVO> selectFeeStandardVOPage(Page<ShopFeeStandardVO> page,
                                                      @Param("shopId") Long shopId,
                                                      @Param("feeType") String feeType,
                                                      @Param("status") Integer status);
    
    /**
     * 分页查询费用标准VO（包含店铺名称，支持数据权限过滤）
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param status 状态
     * @param shopIds 有权限的店铺ID列表
     * @return 分页结果
     */
    IPage<ShopFeeStandardVO> selectFeeStandardVOPageWithPermission(Page<ShopFeeStandardVO> page,
                                                                     @Param("shopId") Long shopId,
                                                                     @Param("feeType") String feeType,
                                                                     @Param("status") Integer status,
                                                                     @Param("shopIds") List<Long> shopIds);
    
    /**
     * 分页查询费用标准VO（包含店铺名称，支持高级搜索条件）
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 遵循《系统状态枚举权威标准声明.md》状态枚举规范
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param status 状态
     * @param minFeeAmount 费用标准金额范围-最小值
     * @param maxFeeAmount 费用标准金额范围-最大值
     * @param effectiveDateStart 生效日期开始
     * @param effectiveDateEnd 生效日期结束
     * @param expiryDateStart 过期日期开始
     * @param expiryDateEnd 过期日期结束
     * @param createTimeStart 创建时间开始
     * @param createTimeEnd 创建时间结束
     * @param keyword 关键字搜索
     * @return 分页结果
     */
    IPage<ShopFeeStandardVO> selectFeeStandardVOPageWithAdvancedSearch(Page<ShopFeeStandardVO> page,
                                                                        @Param("shopId") Long shopId,
                                                                        @Param("feeType") String feeType,
                                                                        @Param("status") Integer status,
                                                                        @Param("minFeeAmount") java.math.BigDecimal minFeeAmount,
                                                                        @Param("maxFeeAmount") java.math.BigDecimal maxFeeAmount,
                                                                        @Param("effectiveDateStart") java.time.LocalDate effectiveDateStart,
                                                                        @Param("effectiveDateEnd") java.time.LocalDate effectiveDateEnd,
                                                                        @Param("expiryDateStart") java.time.LocalDate expiryDateStart,
                                                                        @Param("expiryDateEnd") java.time.LocalDate expiryDateEnd,
                                                                        @Param("createTimeStart") java.time.LocalDateTime createTimeStart,
                                                                        @Param("createTimeEnd") java.time.LocalDateTime createTimeEnd,
                                                                        @Param("keyword") String keyword);
    
    /**
     * 分页查询费用标准VO（包含店铺名称，支持数据权限过滤和高级搜索条件）
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 遵循《系统状态枚举权威标准声明.md》状态枚举规范
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param status 状态
     * @param minFeeAmount 费用标准金额范围-最小值
     * @param maxFeeAmount 费用标准金额范围-最大值
     * @param effectiveDateStart 生效日期开始
     * @param effectiveDateEnd 生效日期结束
     * @param expiryDateStart 过期日期开始
     * @param expiryDateEnd 过期日期结束
     * @param createTimeStart 创建时间开始
     * @param createTimeEnd 创建时间结束
     * @param keyword 关键字搜索
     * @param shopIds 有权限的店铺ID列表
     * @return 分页结果
     */
    IPage<ShopFeeStandardVO> selectFeeStandardVOPageWithPermissionAndAdvancedSearch(Page<ShopFeeStandardVO> page,
                                                                                      @Param("shopId") Long shopId,
                                                                                      @Param("feeType") String feeType,
                                                                                      @Param("status") Integer status,
                                                                                      @Param("minFeeAmount") java.math.BigDecimal minFeeAmount,
                                                                                      @Param("maxFeeAmount") java.math.BigDecimal maxFeeAmount,
                                                                                      @Param("effectiveDateStart") java.time.LocalDate effectiveDateStart,
                                                                                      @Param("effectiveDateEnd") java.time.LocalDate effectiveDateEnd,
                                                                                      @Param("expiryDateStart") java.time.LocalDate expiryDateStart,
                                                                                      @Param("expiryDateEnd") java.time.LocalDate expiryDateEnd,
                                                                                      @Param("createTimeStart") java.time.LocalDateTime createTimeStart,
                                                                                      @Param("createTimeEnd") java.time.LocalDateTime createTimeEnd,
                                                                                      @Param("keyword") String keyword,
                                                                                      @Param("shopIds") List<Long> shopIds);
    
    /**
     * 根据店铺ID查询费用标准列表
     * 
     * @param shopId 店铺ID
     * @return 费用标准列表
     */
    List<ShopFeeStandard> selectFeeStandardsByShopId(@Param("shopId") Long shopId);
    
    /**
     * 根据费用类型查询费用标准列表
     * 
     * @param feeType 费用类型
     * @return 费用标准列表
     */
    List<ShopFeeStandard> selectFeeStandardsByType(@Param("feeType") String feeType);
    
    /**
     * 根据店铺ID和费用类型查询当前有效的费用标准
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param currentDate 当前日期
     * @return 费用标准
     */
    ShopFeeStandard selectCurrentFeeStandard(@Param("shopId") Long shopId,
                                              @Param("feeType") String feeType,
                                              @Param("currentDate") LocalDate currentDate);
    
    /**
     * 根据店铺ID和费用类型查询费用标准列表
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @return 费用标准列表
     */
    List<ShopFeeStandard> selectFeeStandardsByShopIdAndType(@Param("shopId") Long shopId,
                                                              @Param("feeType") String feeType);
    
    /**
     * 根据生效日期查询费用标准列表
     * 
     * @param effectiveDate 生效日期
     * @return 费用标准列表
     */
    List<ShopFeeStandard> selectFeeStandardsByEffectiveDate(@Param("effectiveDate") LocalDate effectiveDate);
    
    /**
     * 根据状态查询费用标准列表
     * 
     * @param status 状态
     * @return 费用标准列表
     */
    List<ShopFeeStandard> selectFeeStandardsByStatus(@Param("status") Integer status);
    
    /**
     * 统计费用标准数量
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @return 费用标准数量
     */
    Integer countFeeStandards(@Param("shopId") Long shopId, 
                             @Param("feeType") String feeType);
    
    /**
     * 检查费用标准是否存在冲突
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param effectiveDate 生效日期
     * @param excludeId 排除的标准ID
     * @return 是否存在冲突
     */
    Boolean existsConflict(@Param("shopId") Long shopId,
                          @Param("feeType") String feeType,
                          @Param("effectiveDate") LocalDate effectiveDate,
                          @Param("excludeId") Long excludeId);
}
